package cn.iocoder.yudao.module.member.assets.service;

import cn.iocoder.yudao.framework.business.basic.service.MemberExtensionService;
import cn.iocoder.yudao.framework.business.basic.service.SimpleDetailService;
import cn.iocoder.yudao.module.api.member.assets.enums.CryptocurrencyDeductionType;
import cn.iocoder.yudao.module.member.assets.dal.dataobject.MemberDigitalAssetsDO;
import cn.iocoder.yudao.module.member.assets.vo.*;

import java.util.Collection;
import java.util.List;

/**
 * 数字资产 Service 实现类
 *
 * @author 山野羡民
 */
@SuppressWarnings("unused")
public interface AppMemberDigitalAssetsService extends MemberExtensionService<MemberDigitalAssetsDO>, SimpleDetailService<AppMemberDigitalAssetsRespVO> {

    /**
     * 增加或减少用户的经验
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeExperience(Long userId, Integer number);

    /**
     * 增加或减少用户的成长值/贡献值
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeGrowth(Long userId, Integer number);

    /**
     * 增加或减少用户的积分
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changePoint(Long userId, Integer number);

    /**
     * 增加或减少用户的营业收益
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeRevenue(Long userId, Double number);

    /**
     * 增加或减少用户的佣金
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeCommission(Long userId, Double number);

    /**
     * 增加或减少用户的红包
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeRedPacket(Long userId, Double number);

    /**
     * 增加或减少用户的分红
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeBonus(Long userId, Double number);

    /**
     * 增加或减少用户的消费金
     *
     * @param userId 用户编号
     * @param number 变动数量，负数表示减少
     */
    void changeInterest(Long userId, Double number);

    /**
     * 收益豆抵扣
     *
     * @param userId 用户编号
     * @param number 未增值的变动数量，负数表示减少
     */
    CryptocurrencyDeductionType payCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 收益豆退还
     *
     * @param userId 用户编号
     * @param number 正数
     */
    void refundCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 增加或减少用户的原始的联盟豆
     *
     * @param userId 用户编号
     * @param number 未增值的变动数量，负数表示减少
     */
    void changeCryptocurrencyOrigin(Long userId, Double number);

    /**
     * 增加或减少用户的已增值的联盟豆
     *
     * @param userId 用户编号
     * @param number 未增值的变动数量，负数表示减少
     */
    void exchangeCryptocurrencyIncrementToMoney(Long userId, Double number);

    /**
     * 释放商家原始的联盟豆，即：减少冻结中的联盟豆并增加原始的联盟豆
     *
     * @param userId 用户编号
     * @param number 数量，只能是正数
     */
    void unfreezeCryptocurrencyOrigin(Long userId, Double number);

    /**
     * 联盟豆转为收益豆
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void exchangeCryptocurrencyOriginToIncrement(Long userId, Double number);

    /**
     * 增加或减少用户的冻结中的联盟豆
     *
     * @param userId 用户编号
     * @param number 冻结中的变动数量，负数表示减少
     */
    void changeCryptocurrencyFreezing(Long userId, Double number);

    /**
     * 联盟豆兑换投入收益池
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void exchangeCryptocurrencyOriginToIncreasing(Long userId, Double number);

    /**
     * 联盟豆增值
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void increaseCryptocurrencyIncrement(Long userId, Double number);

    /**
     * 返回联盟豆本金
     *
     * @param userId 用户编号
     * @param number 数量，正数
     */
    void returnCryptocurrencyIncreasing(Long userId, Double number);

    /**
     * 列表
     *
     * @param userIds 用户编号集合
     * @return 列表信息
     */
    List<AppMemberDigitalAssetsRespVO> getListByUserIds(Collection<Long> userIds);

    /**
     * 联盟豆概览（含收益豆）
     *
     * @param userId 用户编号
     */
    AppCryptocurrencyOverviewRespVO getCryptocurrencyOverview(Long userId);

    /**
     * 联盟豆兑换零钱
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitCryptocurrencyOriginToMoney(Long userId, Integer amount);

    /**
     * 收益豆兑换零钱
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitCryptocurrencyIncrementToMoney(Long userId, Integer amount);

    /**
     * 联盟豆转收益豆
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitCryptocurrencyOriginToIncrement(Long userId, Integer amount);

    /**
     * 联盟豆兑换投入收益池
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitCryptocurrencyOriginToIncreasing(Long userId, Integer amount);

    /**
     * 分红概览
     *
     * @param userId 用户编号
     */
    AppBonusOverviewRespVO getBonusOverview(Long userId);

    /**
     * 分红兑换零钱
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitBonusToMoney(Long userId, Integer amount);

    /**
     * 公益勋章概览
     *
     * @param userId 用户编号
     */
    AppShareholdingOverviewRespVO getShareholdingOverview(Long userId);

    /**
     * 消费金兑换零钱
     *
     * @param userId 用户编号
     * @param amount 兑换数量
     */
    void submitInterestToMoney(Long userId, Integer amount);

    /**
     * 联盟豆兑换投入预设列表
     *
     * @param userId 用户编号
     */
    List<AppCryptocurrencyIncreasingPresetVO> getCryptocurrencyIncreasingPresetList(Long userId);

    /**
     * 贡献值概览
     *
     * @param userId 用户编号
     */
    AppGrowthOverviewRespVO getGrowthOverview(Long userId);

}